package com.learn.algorlthm;

/**
 * @classname:
 * @Description: 复杂链表的复制
 * @author: yfpu(fengpu.yang @ ucarinc.com)
 * @Date: 2018-08-03 17:50
 * 题目描述：
 * 输入一个复杂链表（每个节点中有节点值，以及两个指针，一个指向下一个节点，另一个特殊指针指向任意一个节点），返回结果为复制后复杂链表的 head。
 */
public class Learn35 {


    /**
     * 解题思路:
     * 第一步，在每个节点的后面插入复制的节点。
     * 第二步，对复制节点的radom链接进行赋值。
     * 第三步，拆分
     */

    public static RandomListNode clone(RandomListNode pHead) {
        if (pHead == null)
            return null;
        //第一步
        RandomListNode cur = pHead;
        while (cur != null) {
            RandomListNode clone = new RandomListNode(cur.label);
            clone.next = cur.next;
            cur.next = clone;
            cur = clone.next;
        }

        //第二步
        cur = pHead;
        while (cur != null) {
            RandomListNode clone = cur.next;
            if (cur.random != null)
                clone.random = cur.random.next;
            cur = clone.next;
        }

        //第三步
        cur = pHead;
        RandomListNode pCloneHead = pHead.next;
        while (cur.next != null) {
            RandomListNode next = cur.next;
            cur.next = next.next;
            cur = next;
        }

        return pCloneHead;
    }


    public static class RandomListNode
    {
        int label;
        RandomListNode next = null;
        RandomListNode random = null;

        RandomListNode(int label) {
            this.label = label;
        }
    }
}
